---
title: python 进阶
date: 2023-10-02 22:10:43 
images: ['https://kodo.huixiangwuyou.com/blog/images/nodecrawl.png']
layout: PostBanner 
summary: '学习的内容包含：模块、 第三方常见模块'
tags: 
 - python
---



### 模块
在整个python中，一个.py文件就是一个模块，模块的名字就是文件名。在引入模块时，默认是在项目中查找模块和包名。
####  模块的导入方式
- 导入整个模块：import module_name [as alias]
- 导入特定的函数：from module_name import function_name
- 导入模块中的所有函数：from module_name import *|func|\{变量名\}
```python
# 导入的模块包含模块内的变量、函数、类等，自己写的.py文件也可以作为模块导入
import module_name [as alias]
module_name.function_name()
alias.function_name()

from module_name import function_name
function_name()

from module_name import *|func|{变量名}
function_name()

# 若是以 * 导入，会导入所有的函数、变量等,然后直接使用函数、变量
function_name()


# 若是函数名与自己定义的函数名相同，会覆盖掉
# 解决办法：将两个模块相同的文件以模块名区分，然后通过模块名调用方法
import module_name 
import module_name2 
module_name.function_name()
module_name2.function_name()


# 查找模块包名
my_project
├── project_dir
    ├──sys
    │  └──my_module.py
import sys.my_module as a
# 上面的意思是查找文件夹 sys 下的模块 my_module ，然后将其重命名为 a 进行调用
# 若是引入的模块与当前编辑的文件在同一个目录下，直接使用模块名进行调用 
# 同层级加目录会报（注意：模块名不能以数字开头）
# ModuleNotFoundError: No module named 'my_module'
```
> 模块的导入问题
一般来说，依赖或者公共模块内都没有立即执行或者打印的语句，但是在自定义的模块或者调用他人的模块时，会出现打印的语句，这是因为导入模块时，会执行模块内的语句。
解决办法：
- 模块内的语句放在 if __name__ == '__main__' 内，然后调用函数
```python

if __name__ == '__main__'
    # 模块内的语句,将之前的代码放到下面

```

#### 常见模块
在安装python时，会自带一些模块，这些模块可以直接使用。比如在pycharm中，项目文件下外部库的lib文件夹下，就是python自带的模块。
常见的模块有：
- os：操作系统相关的模块
- sys：系统相关的模块
- time：时间相关的模块
- datetime：日期时间相关的模块
- random：随机数相关的模块
- math：数学相关的模块
- json：json相关的模块
- re：正则表达式相关的模块
- collections：集合相关的模块
- functools：函数相关的模块
- itertools：迭代器相关的模块
- multiprocessing：多进程相关的模块
- threading：多线程相关的模块
- asyncio：异步IO相关的模块
- aiohttp：异步HTTP相关的模块
- requests：HTTP相关的模块
- beautifulsoup4：HTML解析相关的模块
- selenium：自动化测试相关的模块
- pytest：测试框架相关的模块
- flask：Web框架相关的模块
- django：Web框架相关的模块
- sqlalchemy：数据库ORM相关的模块
- pymysql：MySQL数据库相关的模块
- pymongo：MongoDB数据库相关的模块
- redis：Redis数据库相关的模块
- celery：任务队列相关的模块
- celerybeat：定时任务相关的模块
- celeryd：任务执行器相关的模块
- celeryflower：任务监控相关的模块
- celerycam：任务监控相关的模块
- celeryev：任务监控相关的模块
- celerymon：任务监控相关的模块
- celeryworker：任务执行器相关的模块

> random模块 是Python中用于产生随机数的标准库

| 函数名称 | 功能描述 |
| --- | --- | 
| seed(x) | 初始化给定的随机数种子，默认为当前系统时间 |
| random() | 产生一个[0.0,1.0)之间的随机小数 |
| randint(a,b) | 生成一个[a,b]之间的整数 |
| randrange(m,n,k) | 生成一个[m,n)之间步长为k的随机整数 |
| uniform(a,b) | 生成一个[a,b]之间的随机小数 |
| choice(seq) | 从序列中随机选择一个元素 |
| shuffle(seq) | 将序列seq中元素随机排列，返回打乱后的序列 |
|  |  |  
```python
import random
# 初始化给定的随机数种子，默认为当前系统时间
random.seed(10)

# 随机验证码
# 随机生成一个6位的验证码，包含数字和字母
def random_num():
    return str(random.randint(0,9)) # 数字
def random_upper():
    return chr(random.randint(65,90)) # 大写字母
def random_lower():
    return chr(random.randint(97,122)) # 小写字母

# 随机生成一个6位的验证码，包含数字和字母    
def random_verify_code(n=6):
    lt = []
    for i in range(n):
        which=random.randint(1,3) # 随机生成1,2,3
        if which==1:
            lt.append(random_num())
        elif which==2:
            lt.append(random_upper())
        else:
            lt.append(random_lower())
    return ''.join(lt) # 将列表转换为字符串
print(random_verify_code(6))
```

> time模块 是Python中提供的用于处理时间的标准库，可以用来进行时间处理、时间格式化和计时等

| 函数名称 | 功能描述 |
| --- | --- | 
| time() | 获取当前时间戳 |
| localtime(sec) | 获取指定时间戳对应的本地时间的struct time对象 |
| ctime() | 获取当前时间戳对应的易读字符串 |
| strftime() | 格式化时间，结果为字符串 |
| strptime() | 提取字符串的时间，结果为struct time对象 |
| sleep(sec) | 休眠sec秒 |
|  |  |  
```python
import time
# 获取当前时间戳
t=time.time()
print(t)
# 获取当前时间戳对应的本地时间的struct time对象
lt=time.localtime(t)
print('年：',lt.tm_year)
print('月：',lt.tm_mon)
print('日：',lt.tm_mday)
print('小时：',lt.tm_hour)

```

> datetime模块可以更方便的显示日期并对日期进行运算。

| 函数名称 | 功能描述 |
| --- | --- |
| datetime.datetime | 表示日期时间的类 |
| datetime.timedelta | 表示时间间隔的类 |
| datetime.date | 表示目期的类 |
| datetime.time | 表示时间的类 |
| datetime.tzinfo | 时区相关的类 |
|   |   |
```python
import datetime
# 获取当前日期时间
now=datetime.datetime.now()
print(now)  
t1=datetime.datetime(2023,10,2,22,10,43)
diff=now - t1
print(diff.get_days()) # 间隔的天数
print(diff.total_seconds()) # 间隔实际的秒数

cur=now.strftime('%Y年-%m月-%d日 %H:%M:%S') # 格式化日期时间
s1=input('请输入日期时间（格式：2023-10-02 22:10:43）：')
t2=datetime.datetime.strptime(s1,'%Y-%m-%d %H:%M:%S') # 提取字符串的时间，结果为struct time对象
print(t2)

```
> pickle模块 是Python中用于序列化和反序列化对象的标准库，可以将Python对象转换为字节流，然后将其保存到文件中，或者从文件中读取字节流，然后将其转换为Python对象。
| 函数名称 | 描述说明|
| --- | --- | 
| dumps(obj) | 把对象(数据)转化为字节，编码过程 |
| loads(s) | 把字节转化为数据，解码过程 |
| dump(obj,file) | 与dumps()功能相同，把对象序列化成字节存储到文件file中 |
| load(file) | 与loads()功能相同，从文件file中字节反序列化成对象数据 |
|  |  |  
<br/>  

> json模块的常用函数
| 函数名称 | 描述说明|
| --- | --- | 
| json.dumps(obj) | 将Python数据类型转成JSON格式过程，编码过程 |
| json.loads(s) | 将JSON格式字符串转成Python数据类型，解码过程 |
| json.dump(obj,file) | 与dumps()功能相同，将转换结果存储到文件file中 |
| json.load(file) | 与loads()功能相同，从文件file中读入数据 |
|  |  |  
```python
import json
# 将Python数据类型转成JSON格式过程，编码过程
d1={"name":"huixiangwuyou","age":18}
s1=json.dumps(d1) # 将字典转换为字符串
print(s1) # {"name":"huixiangwuyou","age":18}
# 将JSON格式字符串转成Python数据类型，解码过程
d2=json.loads(s1) # 将字符串转换为字典
print(d2) # {'name': 'huixiangwuyou', 'age': 18}
```

> hashlib模块 是Python中用于加密的标准库，可以用于生成各种哈希算法的摘要。
```python
import hashlib
# 生成md5摘要
m=hashlib.md5()
m.update('hello'.encode('utf-8')) # 加密
print(m.hexdigest()) # 16进制
# 解决MD5的撞库问题
# 1. 加盐：在密码的前面或者后面添加一些随机的字符串，然后再进行加密
mm=hashlib.md5(d'qweqrerwtqwe34564q65w4e5qw')
mm.update('hello'.encode('utf-8')) # 加密
print(m.hexdigest())
# 生成sha1摘要
s=hashlib.sha1()
s.update('hello'.encode('utf-8')) # 加密
print(s.hexdigest()) # 16进制
```
> shutil模块 是Python中用于文件和目录操作的标准库，可以用于复制、移动、删除、压缩和解压缩文件等操作。
```python
import shutil
# 复制文件
shutil.copy('hello.txt','hello2.txt') # 复制文件
shutil.copyfile('hello.txt','hello2.txt') # 只复制文件信息,不包含文件权限
# 复制目录
shutil.copytree('dir1','dir2') # 复制目录
# 移动文件
shutil.move('hello.txt','dir1') # 移动文件
# 移动目录
shutil.move('dir1','dir2') # 移动目录
# 删除文件
shutil.rmtree('dir1') # 删除目录    
```

> logging模块 是Python中用于记录日志的标准库，可以用于记录程序的运行日志，方便调试和排查问题。
- level=logging.INFO 日志级别，INFO表示记录信息、警告、错误、严重错误
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' 日志格式
- asctime 时间，name 模块名，levelname 日志级别，message 日志信息
- 日志级别：DEBUG、INFO、WARNING、ERROR、CRITICAL
    - 日志级别从低到高，依次为：DEBUG、INFO、WARNING、ERROR、CRITICAL
    - 当设置日志级别为INFO=10时，只会记录INFO、WARNING、ERROR、CRITICAL级别的日志
    - 当设置日志级别为WARNING=30时，只会记录WARNING、ERROR、CRITICAL级别的日志
    - 当设置日志级别为ERROR=40时，只会记录ERROR、CRITICAL级别的日志
    - 当设置日志级别为CRITICAL=50时，只会记录CRITICAL级别的日志
- filename='example.log' 日志文件的路径和文件名
- filemode='a' 日志文件的打开模式，a表示追加模式，w表示覆盖模式
- datefmt='%Y-%m-%d %H:%M:%S' 日志时间的格式
- formatters 日志格式
- handlers 日志处理器，用于将日志输出到不同的地方，比如文件、控制台、邮件等
- loggers 日志记录器，用于记录日志
- filters 日志过滤器，用于过滤日志
- 日志处理器的常用函数：
- addHandler(handler)：添加日志处理器
- removeHandler(handler)：移除日志处理器
- setLevel(level)：设置日志级别
- 日志记录器的常用函数：
- addHandler(handler)：添加日志处理器

```python
import logging
logging.basicConfig(level=30.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 记录日志
logging.info('hello world') # 记录信息
logging.warning('hello world') # 记录警告
logging.error('hello world') # 记录错误
logging.critical('hello world') # 记录严重错误
```

> traceback模块 是Python中用于获取异常信息的标准库，可以用于获取异常信息，方便调试和排查问题。
```python
import traceback
try:
    1/0
except Exception as e:
    print(e) # 输出异常信息
    print(traceback.format_exc()) # 输出异常信息
    # 输出异常信息到文件 或者是logging模块处理
    with open('error.log','a') as fp:
        fp.write(traceback.format_exc())
```   

> zipfile模块 是Python中用于压缩和解压缩文件的标准库，可以用于压缩和解压缩文件，方便文件的传输和存储。
```python
import zipfile
# 压缩文件
with zipfile.ZipFile('hello.zip','w') as zf:
    zf.write('a.txt') # 压缩文件
    zf.write('b.txt') # 压缩文件

# 解压文件
f=zipfile.ZipFile('zip_dir/abc.zip',mode='r')
# 直接全部解压
# f.extractall("zip_dir/abcd")
for item in f.namelist():
    f.extract(item,"zip_dir/all")
f.close()
```

<br/>

### 第三方模块
在python中，第三方模块是由社区提供的模块，这些模块可以直接使用，不需要自己编写。
第三方模块的安装卸载和升级方式：
```
- pip install module_name
- pip install module_name==version
- pip install module_name>=version # 安装指定版本或更高版本的模块
- pip install module_name<=version # 安装指定版本或更低版本的模块
- pip install module_name~=version # 安装指定版本或相近版本的模块
- pip install module_name==version --upgrade # 升级指定版本的模块
- pip install module_name==version --no-cache-dir # 不使用缓存安装指定版本的模块
- pip install module_name==version --user # 安装指定版本的模块到用户目录下
- pip install module_name http://pypi.douban.com/simple --trusted-host pypi.douban.com
- pip `uninstall` module_name # 卸载指定版本的模块
- pip install module_name --upgrade --force-reinstall # 强制升级指定版本的模块
- python -m pip install --upgrade pip # 使用Python升级pip工具
```

#### requests模块
requests模块是一个HTTP客户端库，它可以发送HTTP请求并获取响应。
requests模块的常用函数：
- get(url, params=None, **kwargs)：发送GET请求，返回响应对象。
- post(url, data=None, json=None, **kwargs)：发送POST请求，返回响应对象。
- put(url, data=None, **kwargs)：发送PUT请求，返回响应对象。
- delete(url, **kwargs)：发送DELETE请求，返回响应对象。
- head(url, **kwargs)：发送HEAD请求，返回响应对象。 
```python
import requests
url="https://blog.huixiangwuyou.com"
url2="https://kodo.huixiangwuyou.com/blog/images/mysql.jpeg"
resp = requests.get(url2)
resp.encoding='utf-8'
# print(resp.text) # 获取 html

print(resp.content) # 若是爬取是图片获取 二进制
with open("load.jpeg","wb") as fp:
    fp.write(resp.content)
```
<br/>

#### openpyxl模块
openpyxl模块是一个用于读写Excel文件的Python库。
openpyxl模块的常用函数：
- load_workbook(filename)：加载Excel文件，返回工作簿对象。
- Workbook()：创建新的工作簿对象。
- create_workbook()：创建新的工作簿对象。
- save(filename)：保存工作簿对象到文件。
- active：获取活动工作表。
- create_sheet(title, index)：创建新的工作表，title为工作表标题，index为工作表索引。
- delete_sheet(sheet)：删除指定的工作表。
- sheetnames：获取所有工作表的名称。
- sheet1 = wb['Sheet1']：获取指定名称的工作表。
- sheet1 = wb.active：获取活动工作表。
- cell(row, column, value)：获取或设置指定单元格的值。
```python
# 创建新的工作表
from openpyxl import Workbook
cj=[
    ['姓名','语文','数学','英语'],
    ['李世民', '100', '75', '59'],
    ['刘备', '90', '65', '95']
]
wb = Workbook()
sheet = wb.create_sheet('班级学生成绩单')
for item in cj:
    sheet.append(item)
wb.save('abs.xlsx')

from openpyxl import load_workbook
# 打开工作簿
wb = load_workbook('abs.xlsx')
# 获取活动工作表
# sheet = wb['班级学生成绩单']
sheet = wb['Sheet']
# 获取单元格的值
cell_value = sheet['A1'].value
# 设置单元格的值
sheet['A1'] = 'Hello, World!'
# 保存工作簿 不能打开文件，否则报错：PermissionError: [Errno 13] Permission denied: 'abs.xlsx'
wb.save('abs.xlsx')
```

#### pdfplumber模块
pdfplumber模块是一个用于解析PDF文件的Python库。
pdfplumber模块的常用函数：
- open(filename)：打开PDF文件，返回PDF对象。
- pages：获取所有页面。
- extract_text()：提取文本。
- extract_table()：提取表格。
- extract_images()：提取图像。
- extract_graphics()：提取图形。
```python
import pdfplumber
# 打开PDF文件
pdf = pdfplumber.open('abs.pdf')
# 获取所有页面
pages = pdf.pages
# 提取文本
text = pages[0].extract_text()
# 提取图像
images = pages[0].extract_images()
# 提取图形
graphics = pages[0].extract_graphics()
# 关闭PDF文件
pdf.close()

import pdfplumber

with pdfplumber.open('git.pdf') as fp:
    for i in fp.pages:
        print(i.extract_text()) # extract_text()获取内容
        print(f'第---{i.page_number}页')
```

<br/>   

#### numpy模块 matplotlib模块
numpy模块是一个用于科学计算的Python库。
numpy模块的常用函数：
- array()：创建数组。
- zeros()：创建全0数组。
- ones()：创建全1数组。
- full()：创建指定值数组。
- arange()：创建等差数列。
- linspace()：创建等间隔数组。
- random()：创建随机数组。
- reshape()：改变数组形状。
- transpose()：转置数组。
- concatenate()：合并数组。
- split()：分割数组。
- sort()：排序数组。
- searchsorted()：查找元素位置。
- unique()：去重数组。
- where()：查找元素位置。
- sum()：求和。
- mean()：求平均值。
- std()：求标准差。
- var()：求方差。
- max()：求最大值。
- min()：求最小值。
- argmax()：求最大值位置。
- argmin()：求最小值位置。
- dot()：矩阵乘法。
- cross()：向量积。
- outer()：外积。
- matmul()：矩阵乘法。
- vdot()：向量点积。
- inner()：向量内积。
- kron()：克罗内克积。

matplotlib 模块是一个用于绘制图表的Python库。
matplotlib模块的常用函数：
- plot()：绘制折线图。
- bar()：绘制柱状图。
- hist()：绘制直方图。
- scatter()：绘制散点图。
- pie()：绘制饼图。
- boxplot()：绘制箱线图。
- contour()：绘制等高线图。
- contourf()：绘制填充等高线图。
- imshow()：绘制图像。
- savefig()：保存图像。
- show()：显示图像。
- xlabel()：设置x轴标签。
- ylabel()：设置y轴标签。
- title()：设置标题。
- legend()：设置图例。
- grid()：设置网格。
- xlim()：设置x轴范围。
- ylim()：设置y轴范围。
- xticks()：设置x轴刻度。

```python
# 将图片变灰
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
n1=plt.imread('load.jpeg')
print(n1)
# 三维数组，最高维度表示图像高，次维度表示图像宽，最低表示图像[R，G，B]颜色
plt.imshow(n1)
# 写一个灰度公式
n2=np.array([0.299,0.597,0.114])

x=np.dot(n1,n2)
# 传入数组显示灰度
plt.imshow(x,cmap='gray')
plt.show()
```
![图片置灰](https://kodo.huixiangwuyou.com/blog/images/python/350403214754.png)
<br/>

#### pandas模块
pandas模块是一个用于数据处理和分析的Python库。
pandas模块的常用函数：
- DataFrame()：创建数据框。
- read_csv()：读取CSV文件。
- read_excel()：读取Excel文件。
- read_sql()：读取SQL数据库。
- read_html()：读取HTML文件。
- read_json()：读取JSON文件。
- read_pickle()：读取Pickle文件。
- read_hdf()：读取HDF文件。
- read_feather()：读取Feather文件。
- read_parquet()：读取Parquet文件。
- read_gbq()：读取BigQuery文件。
- read_sql_table()：读取SQL数据库表。
- read_sql_query()：读取SQL数据库查询结果。
- read_sql_schema()：读取SQL数据库表结构。
- read_sql_table()：读取SQL数据库表。
- read_sql_query()：读取SQL数据库查询结果。
- read_sql_schema()：读取SQL数据库表结构。

```python
import pandas as pd
import matplotlib.pyplot as plt
# 模拟班级成绩数据
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '孙七'],
    '成绩': [85, 90, 78, 92, 88]
}

# 创建 DataFrame
df = pd.DataFrame(data)
# 解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 100

# 绘制柱形图
plt.bar(df['姓名'], df['成绩'])

# 添加标题和标签
plt.title('班级成绩柱形图')
plt.xlabel('姓名')
plt.xticks(rotation=45)
plt.ylabel('成绩')

# 显示图形
plt.show()
```
![班级成绩柱形图](https://kodo.huixiangwuyou.com/blog/images/python/66403221058.png)

<br/>

#### PyEchoCharts模块
PyEcharts是由百度开源的数据可视化库，它对流行图的支持度比较高，它给用户提供了30多种图形,如柱形渐变图K线周期图等
中文帮助文档:https://pyecharts.org/#/zh-cn/

<br/>

#### PIL模块
PIL模块是Python Imaging Library的缩写，是Python中用于处理图像的库。
```
pip install pillow
```
PIL模块的常用函数：
- open()：打开图像文件。


<br/>

#### jieba模块
jieba模块是一个中文分词库，它可以将中文文本切分为词语。
jieba模块的常用函数：
- cut()：分词。

#### PyInstaller模块
PyInstaller是可以在Windows操作系统中将Python源文件打包成.exe的可执行文件。还可以在Linux和Mac OS操作系统中对源文件进行打包操作。
打包的语法结构为: pyinstaller -F \{源文件文件名.py\}
注意事项:
在进行文件打包时，需要打包的文件尽量不要有中文，而且需要打包的文件路径也尽量不要有中文，路径中包含中文有可能会导致打包失败
PyInstaller模块的常用函数：
- freeze()：打包。

<br/>

#### OS模块
OS模块是Python中用于操作操作系统的标准库。
OS模块的常用函数：
- getcwd()：获取当前工作目录。
- chdir()：改变当前工作目录。
- listdir()：列出指定目录下的所有文件和子目录。
- mkdir()：创建目录。
- makedirs()：创建多级目录。
- rmdir()：删除目录。
- remove()：删除文件。
- stat()：获取文件状态信息。
  - st_size：文件大小。
  - st_mtime：文件修改时间。
  - st_ctime：文件创建时间。
  - st_atime：文件访问时间。
- rename()：重命名文件或目录。
- system()：运行系统命令。
- path.exists()：判断路径是否存在。
- path.isfile()：判断路径是否为文件。
- path.isdir()：判断路径是否为目录。
- path.join()：连接路径。
- path.split()：分割路径。
- path.splitext()：分割路径和扩展名。
- path.abspath()：获取绝对路径。
- walk()：遍历目录树。
- environ()：获取环境变量。
- getenv()：获取环境变量。

